EFCF Use Case PostalCodes Updating
Een rij wijzigen in de PostalCodes tabel
Probleem
- De beheerder moet een postcode kunnen selecteren en de mogelijkheid krijgen de gegevens ervan te wijzigen.
- De gegevens die in de Form zijn ingetypt moeten overgebracht naar de PostalCodes tabel in SQL server.
- Wat houdt dat in een postcode updaten? Eigenlijk gaat het om twee use cases:
- de mogelijkheid bieden om de gegevens van een bestaande postcode te wijzigen;
- de gewijzigde gegevens van de postcode effectief in de tabel PostalCodes opslaan
We beginnen met de use case voor het mogelijk maken van het toevoegen van een postcode, namelijk PostalCodes Updating.
Design
We beginnen met het bestuderen van het use case diagram in Mikmak use cases PostalCodes. Vervolgens bestuderen we de beschrijving voor use case PostalCodes Updating dat ook in Mikmak use cases PostalCodes is opgenomen.
We gaan dit implementeren in het Model-View-Control patroon.
Model
Het model hebben we al gemaakt in de vorige oefening EFCF PostalCodes Entiteit.
View
De trigger waarmee de actor de use case opstart is een link op de Selecting pagina van PostalCodes sectie van de website. Deze pagina staat in de Views/PostalCodes map. Door op die link te klikken gaat de gebruiker naar de Updating pagina van de PostalCodes sectie, die ook in /Views/PostalCodes map staat. Op die Updating pagina staat een html form element met tekstboxen, labels en een submit knop waarmee hij de extended use case PostalCodes Update kan opstarten. Hij heeft ook een alternatief, hij kan zijn poging om een postcode toe te voegen ook annuleren.
Controller
De controller handelt de interactie met de gebruiker af. De gebruiker interageert met de website via een hyperlink of een submit knop. De link of de submit knop geven de use case door aan de controller die op zijn beurt beslist wat er moet gebeuren om de use case uit te voeren. Hier moeten we maar een actie-methode implementeren in de PostalCodesController
klasse:
- de actie-methode moet de gegevens van de te wijzigen postcode uit de database ophalen en een form met invulvelden presenteren om de gegevens van de postcode te kunnen wijzigen;
Oplossing
Model
De oplossing voor het model vind je in de vorige oefening EFCF PostalCodes Entiteit.
View
In de map Views/PostalCodes maak je een MVC Razor met lay-out bestand met de naam Updating.cshtml met daarin een HTML form element en input-velden. Als de beheerder straks op de Update knop klikt hebben we de Id nodig van postcode om de te wijzigen postcode in de tabel in de database te kunnen opzoeken. Id's worden door het programma gebruikt om rijen in de tabel te kunnen identificeren. Het zijn nummers die voor de gebruiker niet van belang zijn. We slaan de Id dan ook op in een hidden input veld.
@{
Layout = "~/Views/Shared/_LayoutPage.cshtml";
}
@model LerenWerkenMetEFCF.Models.PostalCodes
@using (Html.BeginForm("Update", "PostalCodes"))
{
@Html.ValidationSummary()
<p>
@Html.LabelFor(model => model.PostalCode)
@Html.EditorFor(model => model.PostalCode)
@Html.ValidationMessageFor(model => model.PostalCode)
</p>
<p>
@Html.LabelFor(model => model.Location)
@Html.EditorFor(model => model.Location)
@Html.ValidationMessageFor(model => model.Location)
</p>
@Html.HiddenFor(model => model.Id)
<input type="hidden" value="@Model.Id" name="Id" />
<button type="submit" value="Update" name="Update">Update</button>
}
Controller
De HomeController
hoeven we niet te wijzigen sinds de vorige oefening. We moeten alleen één actiemethode toevoegen aan de PostalCodesController
. De PostalCodesController
staat in het bestand met de naam PostalCodesController.cs in de map Controllers.
Updating
Deze methode wordt uitgevoerd wanneer de gebruiker klikt op de link "Update" op het Selecting pagina van de PostalCodes sectie van de website. Die methode retourneert een View
en geeft als argument een object of instantie van het type PostalCodes
mee die de gegevens bevat van de te wijzigen postcode. De instantie PostalCodes
halen we op uit de context die we geïnstantieerd hebben aan het begin van de klasse. De actie-methode heeft als parameter de Id
van de te wijzigen postcode en die wordt in de querystring meegegeven in de Updating link van de Selecting pagina. De actiie-methode heeft een [httpGet]
attribuut omdat die wordt opgeroepen door een html a
element en niet door een form
html element. De actie-methode retourneert een Updating view. De parameter is een instantie met de gegevens van de wijzigen postocode.
[HttpGet] // ? zorgt er voor dat een null value geen fout geeft // int cannot be null // int? is shorthand for Nullable<int> which allows you to pretend // that an integer can handle nulls. public ActionResult Updating(int? id) { if (id == null) { ModelState.AddModelError("Ongeldige gegevens", "Geselecteerde postcode niet gevonden."); return View("Selecting"); } else { LerenWerkenMetEFCF.Models.PostalCodes postalCodes = db.PostalCodes.Find(id); if (postalCodes == null) { ModelState.AddModelError("Ongeldige gegevens", "Geselecteerde postcode niet gevonden."); return View("Selecting"); } else { return View(postalCodes); } } }